package com.wn.network.api

import com.wn.common.model.*
import com.wn.network.response.BaseResponse
import retrofit2.http.*

/**
 * @Author: wn
 * @Date: 2024/6/25 16:56
 * @Description: API接口类
 */
interface ApiInterface {
  /**
   * 首页轮播图
   * @return BaseResponse<MutableList<Banner>>
   */
  @GET("/banner/json")
  suspend fun getHomeBanner(): BaseResponse<MutableList<Banner>>?

  /**
   * 首页文章列表
   * @param page Int      -- 页码
   * @param pageSize Int  -- 每页数量
   * @return BaseResponse<ArticleList>?
   */
  @GET("/article/list/{page}/json")
  suspend fun getHomeList(
    @Path("page") page: Int,
    @Query("page_size") pageSize: Int,
  ): BaseResponse<ArticleList>?

  /**
   * 首页项目 一级列表
   * @return BaseResponse<MutableList<ProjectTabItem>>?
   */
  @GET("/project/tree/json")
  suspend fun getProjectTab(): BaseResponse<MutableList<ProjectTabItem>>?

  /**
   * 首页项目 二级列表
   * @param page Int  -- 页码
   * @param cid Int   -- 项目分类的 id
   * @return BaseResponse<MutableList<SubProjectList>>?
   */
  @GET("/project/list/{page}/json")
  suspend fun getSubProjectList(
    @Path("page") page: Int,
    @Query("cid") cid: Int,
  ): BaseResponse<SubProjectList>?

  /**
   * 分类列表
   * @return BaseResponse<MutableList<CategoryItem>>?
   */
  @GET("/navi/json")
  suspend fun getCategoryData(): BaseResponse<MutableList<CategoryItem>>?

  /**
   * 体系 列表
   * @return BaseResponse<MutableList<SystemList>>?
   */
  @GET("/tree/json")
  suspend fun getSystemList(): BaseResponse<MutableList<SystemList>>?

  /**
   * 项目二级文章列表
   * @param page Int   -- 分页数量
   * @param cid Int    -- 项目分类的id
   * @return BaseResponse<ArticleList?>?
   */
  @GET("/article/list/{page}/json")
  suspend fun getArticleList(
    @Path("page") page: Int,
    @Query("cid") cid: Int,
  ): BaseResponse<ArticleList?>?

  /**
   * 用户登陆接口
   * @param username String    -- 用户名
   * @param password String    -- 密码
   * @return BaseResponse<User?>?
   */
  @FormUrlEncoded
  @POST("/user/login")
  suspend fun login(
    @Field("username") username: String,
    @Field("password") password: String,
  ): BaseResponse<User?>?

  /**
   * 用户注册接口
   * @param registerUser RegisterUser  -- 用户注册 信息
   * @return BaseResponse<User?>?
   * @FormUrlEncoded 或者 @Multipart 不可与 @Body 一起使用
   * 应该直接使用 @Field 或 @FieldMap 注解来传递表单数据
   * @Body 注解通常用于传递 JSON 数据,直接作用于 @POST 注释的 请求中即可
   */
  @FormUrlEncoded

  @POST("/user/register")
  suspend fun register(
    @Field("username") username: String,
    @Field("password") password: String,
    @Field("repassword") repassword: String,
  ): BaseResponse<User?>?

  /**
   * 退出登陆
   * @return BaseResponse<Any?>?  返回 null
   */
  @GET("/user/logout/json")
  suspend fun logout(): BaseResponse<Any?>?

  /**
   * 我的收藏列表
   * @param page Int -- 页码
   * @return BaseResponse<ArticleList?>?
   */
  @GET("/lg/collect/list/{page}/json")
  suspend fun getCollectList(
    @Path("page") page: Int,
  ): BaseResponse<ArticleList?>?

  /**
   * 收藏站内文章
   * @param id Int -- 文章 id
   * @return BaseResponse<Any>?
   */
  @POST("/lg/collect/{id}/json")
  suspend fun collectArticle(
    @Path("id") id: Int,
  ): BaseResponse<Any>?

  /**
   * 收藏站外文章
   * @param title String  -- 标题
   * @param author String -- 作者
   * @param link String   -- 链接
   * @return BaseResponse<Any>?
   */
  @POST("/lg/collect/add/json")
  @FormUrlEncoded
  suspend fun collectOutsideArticle(
    @Field("title") title: String,
    @Field("author") author: String,
    @Field("link") link: String,
  ): BaseResponse<Any>?

  /**
   * 文章列表中取消收藏文章
   * @param id Int   -- 文章 id
   * @return BaseResponse<Any>?
   */
  @POST("/lg/uncollect_originId/{id}/json")
  suspend fun cancelCollectArticle(
    @Path("id") id: Int,
  ): BaseResponse<Any>?

  /**
   * 收藏列表中取消收藏文章
   * @param id Int       -- 文章 id
   * @param originId Int -- 收藏之前的那篇文章本身的id
   * @return BaseResponse<Any>?
   */
  @POST("/lg/uncollect/{id}/json")
  @FormUrlEncoded
  suspend fun cancelMyCollect(
    @Path("id") id: Int,
    @Field("originId") originId: Int = -1,
  ): BaseResponse<Any>?

  /**
   * 搜索结果
   * @param page Int        -- 页码
   * @param keyWord String  -- 关键词，支持多个，空格分开
   * @return BaseResponse<ArticleList>?
   */
  @POST("/article/query/{page}/json")
  @FormUrlEncoded
  suspend fun searchResult(
    @Path("page") page: Int,
    @Field("k") keyWord: String,
  ): BaseResponse<ArticleList>?

  /**
   * 搜索热词
   * @return BaseResponse<MutableList<HotSearch>>
   */
  @GET("/hotkey/json")
  suspend fun getHotSearchData(): BaseResponse<MutableList<HotSearch>>?
}
